﻿

//一、输入数字 n，按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3，则打印出 1、2、3 一直到最大的 3 位数 999。
//1. 用返回一个整数列表来代替打印
//2. n 为正整数，0 < n <= 5
int* printNumbers(int n, int* returnSize) {
    *returnSize = pow(10, n) - 1;
    int* arr = (int*)malloc(sizeof(int) * (*returnSize));
    int i = 0;
    for (i = 0; i < *returnSize; i++)
    {
        arr[i] = i + 1;
    }

    return arr;

}




/*二、根据输入的日期，计算是这一年的第几天。
保证年份为4位数且日期合法。*/
#include<stdio.h>
int main()
{
    //1、3、5、7、8、10、12 每月31天，4、6、9、11为30天。
    int arr[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
    int year = 0, mooth = 0, day = 0;
    int count = 0, i = 0;
    scanf("%d%d%d", &year, &mooth, &day);
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
    {
        arr[1] += 1;
    }
    for (i = 0; i < mooth - 1; i++)
    {
        count += arr[i];
    }
    count += day;
    printf("%d\n", count);
    return 0;
}

/*小明同学最近开发了一个网站，在用户注册账户的时候，需要设置账户的密码，为了加强账户的安全性，小明对密码强度有一定要求：

1. 密码只能由大写字母，小写字母，数字构成；

2. 密码不能以数字开头；

3. 密码中至少出现大写字母，小写字母和数字这三种字符类型中的两种；

4. 密码长度至少为8

现在小明受到了n个密码，他想请你写程序判断这些密码中哪些是合适的，哪些是不合法的。*/
#include<stdio.h>
#include<string.h>
int main()
{
    int n = 0;
    while (~scanf("%d", &n))
    {
        for (int i = 0; i < n; i++)
        {
            char password[101] = { 0 };
            int upper = 0, digit = 0, lower = 0, other = 0;
            scanf("%s", &password);
            if (strlen(password) < 8)
            {
                printf("NO\n");
                continue;
            }
            if (password[0] >= '0' && password[0] <= '9')
            {
                printf("NO\n");
                continue;
            }
            char* ptr = password;
            while (*ptr != '\0')
            {
                if (*ptr >= 'a' && *ptr <= 'z')
                    lower++;
                else if (*ptr >= 'A' && *ptr <= 'Z')
                    upper++;
                else if (*ptr >= '0' && *ptr <= '9')
                    digit++;
                else
                    other++;
                ptr++;
            }
            if (other > 0)
            {
                printf("NO\n");
                continue;
            }
            if ((lower > 0) + (upper > 0) + (digit > 0) < 2)
            {
                printf("NO\n");
                continue;
            }
            printf("YES\n");
        }
    }
    return 0;
}

/*集合 s 包含从 1 到 n 的整数。不幸的是，因为数据错误，导致集合里面某一个数字复制了成了集合里面的另外一个数字的值，导致集合 丢失了一个数字 并且 有一个数字重复 。

给定一个数组 nums 代表了集合 S 发生错误后的结果。

请你找出重复出现的整数，再找到丢失的整数，将它们以数组的形式返回。

 

来源：力扣（LeetCode）
链接：https://leetcode.cn/problems/set-mismatch
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。*/
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int cmp(const int* a, const int* b)
{
    return *a - *b;
}
int* findErrorNums(int* nums, int numsSize, int* returnSize)
{
    *returnSize = 2;
    int* errnums = (int*)malloc(sizeof(int*) * numsSize);
    qsort(nums, numsSize, sizeof(int), cmp);
    int prev = 0;
    int i = 0;
    for (i = 0; i < numsSize; i++)
    {
        if (nums[i] == prev)
        {
            errnums[0] = prev;
        }
        else if (nums[i] - prev > 1)
        {
            errnums[1] = prev + 1;
        }
        prev = nums[i];
    }
    if (nums[numsSize - 1] != numsSize)
    {
        errnums[1] = numsSize;
    }
    return errnums;
}

/*有一个长度为 n 的非降序数组，比如[1,2,3,4,5]，将它进行旋转，即把一个数组最开始的若干个元素搬到数组的末尾，变成一个旋转数组，比如变成了[3,4,5,1,2]，或者[4,5,1,2,3]这样的。请问，给定这样一个旋转数组，求数组中的最小值。*/
int minNumberInRotateArray(int* rotateArray, int rotateArrayLen)
{
    if (rotateArrayLen == 0)
        return 0;
    int left = 0;
    int right = rotateArrayLen - 1;
    int mid = 0;
    if (rotateArray[left] < rotateArray[right])
        return rotateArray[0];
    while (left < right)
    {
        mid = ((right - left) >> 1) + left;
        if (rotateArray[mid] > rotateArray[right])
        {
            left = mid + 1;
        }
        else if (rotateArray[mid] < rotateArray[right])
        {
            right = mid;
        }
        else {
            right--;
        }
    }
    return rotateArray[left];
}

/*验证尼科彻斯定理，即：任何一个整数m的立方都可以写成m个连续奇数之和。

例如：

1^3=1

2^3=3+5

3^3=7+9+11

4^3=13+15+17+19

输入一个正整数m（m≤100），将m的立方写成m个连续奇数之和的形式输出。
数据范围：1\le m\le 100\1≤m≤100 
进阶：时间复杂度：O(m)\O(m) ，空间复杂度：O(1)\O(1) */
#include<stdio.h>
int main()
{
    int m = 0;
    while (~scanf("%d", &m))
    {
        int start = m * (m - 1) + 1;
        char buf[1024] = { 0 };
        sprintf(buf, "%d", start);
        int i = 0;
        for (i = 1; i < m; i++)
        {
            sprintf(buf, "%s+%d", buf, start += 2);
        }
        printf("%s\n", buf);

    }
    return 0;
}